package com.hb.alerts;

import com.hb.domain.Spittle;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;

public class AlertServiceImpl implements AlertService {
    private RabbitTemplate rabbit;

    @Autowired
    public AlertServiceImpl(RabbitTemplate rabbit) {
        this.rabbit = rabbit;
    }

    @Override
    public void sendSpittleAlert(Spittle spittle) {
        // 使用 RabbitTemplate 代替 JmsTemplate 来发送 Spittle 提醒。
        // 可以看到，现在 sendSpittleAlert() 调用 RabbitTemplate 的 convertAndSend() 方法，其中 RabbitTemplate 是被注入进来的。它传入了三个参数：Exchange 的名称、
        // routing key 以及要发送的对象。注意，这里并没有指定消息该路由到何处、要发送给哪个队列以及期望哪个消费者来获取消息。
        rabbit.convertAndSend("spittle.alert.exchange", "spittle.alerts", spittle);
    }

    /**
     * RabbitTemplate 还有其他的方法来发送消息，你可能会对此感兴趣。例如，我们可以使用较低等级的 send() 方法来发送 org.springframework.amqp.core.Message 对象，
     * 如下所示：
     * @param spittle
     */
    public void send(Spittle spittle) {
        Message helloMessage = new Message("Hello World!".getBytes(), new MessageProperties());
        // 与 convertAndSend() 方法类似，send() 方法也有重载形式，它们不需要提供 Exchange 名称和/或 routing key。使用 send() 方法的技巧在于构造要发送的 Messag e对象。
        // 在这个 “Hello World” 样例中，我们通过给定字符串的字节数组来构建 Message 实例。对于 String 值来说，这足够了，但是如果消息的负载是复杂对象的话，那它就会复杂得多。
        // 鉴于这种情况，我们有了 convertAndSend() 方法，它会自动将对象转换为 Message。它需要一个消息转换器的帮助来完成该任务，默认的消息转换器是 SimpleMessageConverter，
        // 它适用于 String、Serializable 实例以及字节数组。Spring AMQP 还提供了其他几个有用的消息转换器，其中包括使用 JSON 和 XML 数据的消息转换器。
        rabbit.send("hello.exchange", "hello.routing", helloMessage);
    }
}
